﻿//必须是基类的指针或者引⽤调⽤虚函数
//被调⽤的函数必须是虚函数，并且完成了虚函数重写 / 覆盖。 ?
//
#include<iostream>

using namespace std;
//
//class Person
//{
//public:
//	virtual void Buyticket()
//	{
//		cout << "全价票" << endl;
//	}
//};
//
//class student : public Person
//{
//	/*virtual*/ void Buyticket()
//	{
//		cout << "半价票" << endl;
//	}
//};
//
//void func(Person& p)
//{
//	p.Buyticket();
//}
//
//int main()
//{
//	Person p1;
//	student t1;
//	func(p1);
//	func(t1);
//	return 0;
//}

//协变(了解)
//派⽣类重写基类虚函数时，与基类虚函数返回值类型不同。即基类虚函数返回基类对象的指针或者引
//⽤，派⽣类虚函数返回派⽣类对象的指针或者引⽤时，称为协变。协变的实际意义并不⼤，所以我们
//了解⼀下即可。
//class A {};
//class B : public A {};
//class Person {
//public:
//	virtual A* BuyTicket()
//	{
//		cout << "买票-全价" << endl;
//		return nullptr;
//	}
//};
//class Student : public Person {
//public:
//	virtual B* BuyTicket()
//	{
//		cout << "买票-打折" << endl;
//		return nullptr;
//	}
//};
//void Func(Person* ptr)
//{
//	ptr->BuyTicket();
//}
//int main()
//{
//	Person ps;
//	Student st;
//	Func(&ps);
//	Func(&st);



//为什么基类中的析构函数建议设计为虚函数。
//class A
//{
//public:
//	~A()
//	{
//		cout << "~A" << endl;
//	}
//};
//
//class B : public A
//{
//public:
//
//
//	~B()
//	{
//		cout << "~B" << endl;
//		delete _p;
//	}
//private:
//	int* _p = new int[10];
//};
//
//int main()
//{
//	
//	//A aa;
//	//B bb;
//
//	A* p1 = new A;
//	B* p2 = new B;
//
//	delete p1;
//	delete p2;
//
//	//int a[10] = { 1,1,1,1,1 };
//	//for (int i = 0; i < 5; i++)
//	//{
//	//	bb._p[i] = i;
//	//}
//	//for (int i = 0; i < 5; i++)
//	//{
//	//	cout << bb._p[i] << " ";
//	//}
//	//return 0;
//}


